package com.exm.collectcodenew.juc.concurrenthashmap;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

//直播业务中，每个直播间对应一个topic，每个用户进入直播间时会把自己设备的ID绑定到这个topic 上，也就是一个topic 对应一堆用户设备。
// 可以使用map来维护这些信息，其中key为topic，value 为设备的list。
//问题：topic1房间中的用户会丢失一部分，这是因为put方法如果发现map里面存在这个key，则使用value覆盖该key对应的老的value值。
//解决办法：使用putIfAbsent方法，如果发现已经存在该key则返回该key对应的value，但并不进行覆盖，如果不存在则新增该key，并且判断和写入是原子性操作。
//详见TestMap2
public class TestMap {
    //(1)创建map，key为topic，value为设备列表
    static ConcurrentHashMap<String , List<String>> map =new ConcurrentHashMap<>();

    public static void main(String[] args) {
        //（2）进入直播间topic1，线程one
        Thread threadOne =new Thread(new Runnable() {
            @Override
            public void run() {
                List<String> list1 = new ArrayList<>();
                list1.add("device1");
                list1.add("device2");
                map.put("topic1",list1);
                System.out.println(map.toString());
            }
        });
        //（3）进入直播间topic1，线程two
        Thread threadTwo =new Thread(new Runnable() {
            @Override
            public void run() {
                List<String> list1 = new ArrayList<>();
                list1.add("device11");
                list1.add("device22");
                map.put("topic1",list1);
                System.out.println(map.toString());
            }
        });

        //（4）进入直播间topic2，线程three
        Thread threadThree =new Thread(new Runnable() {
            @Override
            public void run() {
                List<String> list1 = new ArrayList<>();
                list1.add("device111");
                list1.add("device222");
                map.put("topic2",list1);
                System.out.println(map.toString());
            }
        });
        //（5）启动线程
        threadOne.start();
        threadTwo.start();
        threadThree.start();
    }
}
